package com.kabuda.hot100.栈.medium;

import java.util.Stack;

/**
 * @author kabuda
 * @date 2025-03-03 21:40
 * @description 给定一个经过编码的字符串，返回它解码后的字符串。
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 * <p>
 * 示例 1：
 * 输入：s = "3[a]2[bc]"
 * 输出："aaabcbc"
 * <p>
 * 示例 2：
 * 输入：s = "3[a2[c]]"
 * 输出："accaccacc"
 */
public class t394_字符串解码 {
    public static void main(String[] args) {
        System.out.println(decodeString("100[leetcode]"));
    }

    public static String decodeString(String s) {
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            String item = s.substring(i, i + 1);
            if (item.equals("]")) {
                String temp = "";
                while (true) {
                    String pop = stack.pop();
                    if (pop.equals("[")) {
                        break;
                    }
                    temp = pop + temp;
                }
                String numValStr = "";
                while (!stack.isEmpty() && stack.peek().matches("\\d+")) {
                    numValStr = stack.pop()+numValStr;
                }

                String pushVal = "";
                for (Integer integer = 0; integer < Integer.valueOf(numValStr); integer++) {
                    pushVal = temp + pushVal;
                }
                stack.push(pushVal);

            } else {
                stack.push(item);
            }
        }
        String result = "";
        while (!stack.isEmpty()) {
            result = stack.pop() + result;
        }
        return result;
    }
}
